package dao

import (
	"context"

	"go-common/library/cache/memcache"
	"go-common/library/cache/redis"
	"go-common/library/database/sql"
)

// Dao dao.
type Dao struct {
	db          *sql.DB
	redis       *redis.Pool
	redisExpire int32
	mc          *memcache.Pool
	mcExpire    int32
}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

// New new a dao and return.
func New() (dao *Dao) {
	var (
	// dc struct {
	// 	Demo *sql.Config
	// }
	// rc struct {
	// 	Demo       *redis.Config
	// 	DemoExpire xtime.Duration
	// }
	// mc struct {
	// 	Demo       *memcache.Config
	// 	DemoExpire xtime.Duration
	// }
	)
	// checkErr(paladin.Get("mysql.toml").UnmarshalTOML(&dc))
	// checkErr(paladin.Get("redis.toml").UnmarshalTOML(&rc))
	// checkErr(paladin.Get("memcache.toml").UnmarshalTOML(&mc))
	dao = &Dao{
		// // mysql
		// db: sql.NewMySQL(dc.Demo),
		// // redis
		// redis:       redis.NewPool(rc.Demo),
		// redisExpire: int32(time.Duration(rc.DemoExpire) / time.Second),
		// // memcache
		// mc:       memcache.NewPool(mc.Demo),
		// mcExpire: int32(time.Duration(mc.DemoExpire) / time.Second),
	}
	return
}

// Close close the resource.
func (d *Dao) Close() {
	// d.mc.Close()
	// d.redis.Close()
	// d.db.Close()
}

// Ping ping the resource.
func (d *Dao) Ping(ctx context.Context) (err error) {
	// if err = d.pingMC(ctx); err != nil {
	// 	return
	// }
	// if err = d.pingRedis(ctx); err != nil {
	// 	return
	// }
	// return d.db.Ping(ctx)
	return nil
}

// func (d *Dao) pingMC(ctx context.Context) (err error) {
// 	conn := d.mc.Get(ctx)
// 	defer conn.Close()
// 	if err = conn.Set(&memcache.Item{Key: "ping", Value: []byte("pong"), Expiration: 0}); err != nil {
// 		log.Error("conn.Set(PING) error(%v)", err)
// 	}
// 	return
// }

// func (d *Dao) pingRedis(ctx context.Context) (err error) {
// 	conn := d.redis.Get(ctx)
// 	defer conn.Close()
// 	if _, err = conn.Do("SET", "ping", "pong"); err != nil {
// 		log.Error("conn.Set(PING) error(%v)", err)
// 	}
// 	return
// }
